[HVM] Add Etherboot option ROM, for network-booting HVM guests.
authorTim Deegan <Tim.Deegan@xensource.com>
Wed, 20 Dec 2006 11:59:54 +0000 (11:59 +0000)
committerTim Deegan <Tim.Deegan@xensource.com>
Wed, 20 Dec 2006 11:59:54 +0000 (11:59 +0000)
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
tools/examples/xmexample.hvm
tools/firmware/etherboot/README [new file with mode: 0644]
tools/firmware/etherboot/eb-rtl8139.zrom [new file with mode: 0644]
tools/firmware/hvmloader/Makefile
tools/firmware/hvmloader/hvmloader.c

index 143252e65b1255783ee17e023745dfe2bda70f47..33ce3203d341e61539c888873dd1135ec964a37e 100644 (file)
@@ -29,7 +29,7 @@ memory = 128
 
 # Shadow pagetable memory for the domain, in MB.
 # Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
-shadow_memory = 8
+shadow_memory = 8
 
 # A name for your domain. All domains must have different names.
 name = "ExampleHVMDomain"
@@ -116,7 +116,7 @@ disk = [ 'file:/var/images/min-el3-i386.img,hda,w', ',hdc:cdrom,r' ]
 device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
 
 #-----------------------------------------------------------------------------
-# boot on floppy (a), hard disk (c) or CD-ROM (d) 
+# boot on floppy (a), hard disk (c), Network (n) or CD-ROM (d) 
 # default: hard disk, cd-rom, floppy
 #boot="cda"
 
diff --git a/tools/firmware/etherboot/README b/tools/firmware/etherboot/README
new file mode 100644 (file)
index 0000000..c520699
--- /dev/null
@@ -0,0 +1,7 @@
+
+This is an Etherboot option ROM for the rtl8139 NIC.  It has a few
+non-standard settings, just to do with timeouts and when to give up.
+
+Rom-o-matic.net will provide this image at the following URL:
+
+http://rom-o-matic.net/5.4.2/build.php?version=5.4.2&F=ignore&nic=rtl8139%3Artl8139+--+%5B0x10ec%2C0x8139%5D&ofmt=Binary+ROM+Image%28.zrom%29&arch=i386&ASK_BOOT=-1&BOOT_FIRST=BOOT_NIC&BOOT_SECOND=BOOT_NOTHING&BOOT_THIRD=BOOT_NOTHING&BOOT_INDEX=0&STATIC_CLIENT_IP=&STATIC_SUBNET_MASK=&STATIC_SERVER_IP=&STATIC_GATEWAY_IP=&STATIC_BOOTFILE=&EXIT_ON_FILE_LOAD_ERROR=on&DHCP_CLIENT_ID=&DHCP_CLIENT_ID_LEN=&DHCP_CLIENT_ID_TYPE=&DHCP_USER_CLASS=&DHCP_USER_CLASS_LEN=&ALLOW_ONLY_ENCAPSULATED=on&DEFAULT_BOOTFILE=&CONGESTED=on&BACKOFF_LIMIT=7&TIMEOUT=180&TRY_FLOPPY_FIRST=0&EXIT_IF_NO_OFFER=on&TAGGED_IMAGE=on&ELF_IMAGE=on&PXE_IMAGE=on&DOWNLOAD_PROTO_TFTP=on&COMCONSOLE=0x3F8&CONSPEED=9600&COMPARM=0x03&PXE_EXPORT=on&CONFIG_PCI=on&CONFIG_ISA=on&BUILD_ID=&PCBIOS=on&A=Get+ROM
diff --git a/tools/firmware/etherboot/eb-rtl8139.zrom b/tools/firmware/etherboot/eb-rtl8139.zrom
new file mode 100644 (file)
index 0000000..446b55f
Binary files /dev/null and b/tools/firmware/etherboot/eb-rtl8139.zrom differ
index 763f472987991d7330f84aba735bcb7bd64f73b3..44adaa07f9d8a9691f7ff1f377149499bb6e6fdc 100644 (file)
@@ -51,11 +51,12 @@ hvmloader: roms.h acpi/acpi.a $(SRCS)
 acpi/acpi.a:
        $(MAKE) -C acpi
 
-roms.h:        ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin
+roms.h:        ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin ../etherboot/eb-rtl8139.zrom
        sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h
        sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h
        sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin >> roms.h
        sh ./mkhex vmxassist ../vmxassist/vmxassist.bin >> roms.h
+       sh ./mkhex etherboot ../etherboot/eb-rtl8139.zrom >> roms.h
 
 .PHONY: clean
 clean:
index b7729ed85dc6dba7449faf865dc70431fcd78165..5e06273043e35ec59e2c93150c4ba6676dc39307 100644 (file)
@@ -34,6 +34,7 @@
 /* memory map */
 #define HYPERCALL_PHYSICAL_ADDRESS    0x00080000
 #define VGABIOS_PHYSICAL_ADDRESS      0x000C0000
+#define ETHERBOOT_PHYSICAL_ADDRESS    0x000C8000
 #define VMXASSIST_PHYSICAL_ADDRESS    0x000D0000
 #define ROMBIOS_PHYSICAL_ADDRESS      0x000F0000
 
@@ -279,6 +280,27 @@ static void pci_setup(void)
     }
 }
 
+static 
+int must_load_nic(void) 
+{
+    /* If the network card is in the boot order, load the Etherboot 
+     * option ROM.  Read the boot order bytes from CMOS and check 
+     * if any of them are 0x4. */
+    uint8_t boot_order;
+
+    /* Read CMOS register 0x3d (boot choices 0 and 1) */
+    outb(0x70, 0x3d);
+    boot_order = inb(0x71);
+    if ( (boot_order & 0xf) == 0x4 || (boot_order & 0xf0) == 0x40 ) 
+        return 1;
+    /* Read CMOS register 0x38 (boot choice 2 and FDD test flag) */
+    outb(0x70, 0x38);
+    boot_order = inb(0x71);
+    if ( (boot_order & 0xf0) == 0x40 ) 
+        return 1;
+    return 0;
+}
+
 int main(void)
 {
     int acpi_sz;
@@ -312,6 +334,13 @@ int main(void)
                vgabios_stdvga, sizeof(vgabios_stdvga));
     }
 
+    if ( must_load_nic() )
+    {
+        printf("Loading ETHERBOOT ...\n");
+        memcpy((void *)ETHERBOOT_PHYSICAL_ADDRESS,
+               etherboot, sizeof(etherboot));
+    }
+
     if ( get_acpi_enabled() != 0 )
     {
         printf("Loading ACPI ...\n");